package bz.ziro.kanbe.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.slim3.datastore.Datastore;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Transaction;

import bz.ziro.kanbe.meta.SiteMeta;
import bz.ziro.kanbe.model.Page;
import bz.ziro.kanbe.model.Site;
import bz.ziro.kanbe.model.Template;
import bz.ziro.kanbe.model.TemplateBrowser;
import bz.ziro.kanbe.util.KeyFactory;

/**
 * サイトDao
 * @author Administrator
 */
public class SiteDao extends BaseDao<Site> {

	/**
	 * メタデータ
	 */
    private static final SiteMeta siteMeta = new SiteMeta();

    /**
     * サイト検索
     * @param aKey
     * @return
     */
    public static Site find(Long aKey) {
        Key key = KeyFactory.createSiteKey(aKey);
        return Datastore.query(siteMeta)
        		.filter(
        			siteMeta.key.equal(key)
        		).asSingle();
    }

    /**
     * サイトを削除する
     * @param aKey
     */
    public static void delete(Long aKey) {

        Key key = KeyFactory.createSiteKey(aKey);
        List<Key> keyList = new ArrayList<Key>();

        //サイトのページを削除
        List<Page> pageList = PageDao.all(aKey);
        KeyFactory.addPageKey(pageList,keyList);
        List<Template> templateList = TemplateDao.all(aKey);
        KeyFactory.addTemplateKey(templateList,keyList);

        //テンプレート数回繰り返す
        for ( Template template : templateList ) {
            List<TemplateBrowser> browserList = TemplateBrowserDao.all(template.getKey());
            KeyFactory.addBrowserKey(browserList,keyList);
        }

        keyList.add(key);

        Transaction tx = Datastore.beginTransaction();
        Datastore.delete(tx,keyList);
        tx.commit();
    }

    /**
     * サイトを全件取得する
     * @return
     */
    public static List<Site> all() {
        //ページのデータを取得
        return  Datastore.query(siteMeta)
        			.sort(siteMeta.publishDate.asc).asList();
    }

    /**
     * 公開日付検索を行う
     * @return 現在の日付より小さなサイトを取得
     */
    public static Site findPublish() {
        //現在の日付より大きい場合
        List<Site>  siteList = Datastore.query(siteMeta).
                                        filter(
                							siteMeta.publishDate.lessThan(new Date())
                						).sort(siteMeta.publishDate.desc).asList();
        if ( siteList == null || siteList.size() == 0 ) {
            return null;
        }
        return siteList.get(0);
    }

}
